package co.com.utilidades;

import co.com.entidad.TblEstado;
import co.com.entidad.Tblcompania;
import co.com.seguridad.Login;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

public class JsfUtil {

    public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
        int size = selectOne ? entities.size() + 1 : entities.size();
        SelectItem[] items = new SelectItem[size];
        int i = 0;
        if (selectOne) {
            items[0] = new SelectItem("", "---");
            i++;
        }
        for (Object x : entities) {
            items[i++] = new SelectItem(x, x.toString());
        }
        return items;
    }

    public static void asignarEstado(Object o, Class<?> clase) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        try {
            TblEstado objeto = new TblEstado();
            objeto.setIdEstado((long) 1);
            Method[] methods = clase.getMethods();
            for (Method m : methods) {
                System.out.println(m.getName());
                if (m.getName().equals("setIdEstado")) {
                    m.invoke(o, objeto);
                    break;
                }
            }
        } catch (SecurityException ex) {
            Logger.getLogger(JsfUtil.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
    
    public static void asignarCompania(Object o, Class<?> clase) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
        try {
            Tblcompania objeto = new Tblcompania();
            objeto.setCodCompania(consultarCompania());
            Method[] methods = clase.getMethods();
            for (Method m : methods) {
                System.out.println(m.getName());
                if (m.getName().equals("setCodCompania")) {
                    m.invoke(o, objeto);
                    break;
                }
            }
        } catch (SecurityException ex) {
            Logger.getLogger(JsfUtil.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    public static String consultarCompania() {
        FacesContext context = javax.faces.context.FacesContext.getCurrentInstance();
        HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
        Login login =(Login) session.getAttribute("Login");
        return login.getCompania();
    }

    public static void addErrorMessage(Exception ex, String defaultMsg) {
        String msg = ex.getLocalizedMessage();
        if (msg != null && msg.length() > 0) {
            addErrorMessage(msg);
        } else {
            addErrorMessage(defaultMsg);
        }
    }

    public static void addErrorMessages(List<String> messages) {
        for (String message : messages) {
            addErrorMessage(message);
        }
    }

    public static void addErrorMessage(String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, msg, msg);
        FacesContext.getCurrentInstance().addMessage(null, facesMsg);
    }

    public static void addSuccessMessage(String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg);
        FacesContext.getCurrentInstance().addMessage("successInfo", facesMsg);
    }

    public static String getRequestParameter(String key) {
        return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key);
    }

    public static Object getObjectFromRequestParameter(String requestParameterName, Converter converter, UIComponent component) {
        String theId = JsfUtil.getRequestParameter(requestParameterName);
        return converter.getAsObject(FacesContext.getCurrentInstance(), component, theId);
    }

}
